package com.crazymakercircle.imServer.server.session.dao.impl;


import com.crazymakercircle.imServer.server.session.dao.SessionCacheDAO;
import com.crazymakercircle.imServer.server.session.entity.SessionCache;
import com.crazymakercircle.util.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

/*
 *  会话缓存管理的接口实现类
 **/
@Repository("SessionCacheRedisImpl")/*这个注解用于将当前类 标记 为 Spring的仓库Bean，并指定Bean名称
  意义: spring 容器 自动扫描并注册此Bean， 供其他组件（如service）注入 和使用*/
public class SessionCacheRedisImpl implements SessionCacheDAO
{

    public static final String REDIS_PREFIX = "SessionCache:id:";/*定义Redis缓存键的前缀常量，保证Redis键命名的一致性，避免冲突*/
    @Autowired /*用途：标注在字段上，表示由 Spring 自动注入依赖对象。意义：无需手动创建或查找依赖对象，提升开发效率。*/
    protected StringRedisTemplate stringRedisTemplate;//  Redis操作模板类， 声明一个 StringRedisTemplate 实例变量，用于操作 Redis
    /*意义：提供对 Redis 数据库的访问能力，例如存储、查询和删除数据。*/

    private static final long CASHE_LONG = 60 * 4;//4小时之后，得重新登录


    @Override
    public void save(final SessionCache sessionCache)
    {
        String key = REDIS_PREFIX + sessionCache.getSessionId(); /*定义Redis缓存键 由 前缀 和 会话ID 组成*/
        String value = JsonUtil.pojoToJson(sessionCache); /*将会话对象转换为JSON字符串*/
        stringRedisTemplate.opsForValue().set(key, value, CASHE_LONG, TimeUnit.MINUTES);/*并存储到 Redis 中，设置过期时间。*/
    }


    @Override
    public SessionCache get(final String sessionId)
    {
        String key = REDIS_PREFIX + sessionId; /*构建 Redis 查询的键。意义：匹配存储时使用的键格式，确保一致性。*/
        String value = (String) stringRedisTemplate.opsForValue().get(key);/*提取存储的会话数据，准备进行反序列化*/

        if (!StringUtils.isEmpty(value))/*判断获取到的值是否为空。意义：防止空指针异常，确保程序健壮性。*/
        {
            return JsonUtil.jsonToPojo(value, SessionCache.class);/*用途：将 JSON 字符串反序列化为 SessionCache 对象*/
        }     /*意义：恢复原始数据结构，便于后续处理。*/
        return null;/*表示没有可用的会话信息*/
    }

  @Override
    public void remove( String sessionId)
    {
        String key = REDIS_PREFIX + sessionId;
        stringRedisTemplate.delete(key);
    }

}